use std::collections::HashMap;
use crate::cli::Method;
use anyhow::Result;
use config::Config;
use serde::Deserialize;
use serde_json::Value;

#[derive(Deserialize)]
pub(super) struct MeasurementConfig {
    /// 接口路径，必须
    pub(super) url: String,

    /// 请求方法
    #[serde(default)]
    pub(super) method: Method,

    /// 请求头
    #[serde(rename = "header", default)]
    pub(super) headers: HashMap<String, String>,

    /// 表单参数
    #[serde(default)]
    pub(super) form: HashMap<String, Value>,

    /// json参数
    #[serde(default)]
    pub(super) json: HashMap<String, Value>,

    /// 请求数
    #[serde(rename = "num", default = "default_number")]
    pub(super) requests: u64,

    /// 并发数
    #[serde(rename = "thread", default = "default_number")]
    pub(super) threads: u64,

    /// 将请求结果输出到文件
    #[serde(default = "default_output")]
    pub(super) output: String,
}

fn default_number() -> u64 {
    1
}

fn default_output() -> String {
    "output.txt".to_string()
}

impl MeasurementConfig {

    /// 读取配置
    pub(super) fn read(config: &str) -> Result<Self> {
        let config = Config::builder()
            .add_source(config::File::with_name(config))
            .build()?
            .try_deserialize::<MeasurementConfig>()?;

        Ok(config)
    }
}
